home *** CD-ROM | disk | FTP | other *** search
/ Developer Helper 1: Phil & Dave's Excellent CD / Excellent CD HFS.raw / Peripherals / MacinTalk / Interfaces / Lisa / source⁄SpeechAsm.text < prev   
Text File  |  1989-04-13  |  13KB  |  392 lines

  1. ;-------------------------------------------------------------------------------;
  2. ;                                            ;
  3. ;      SpeechGlue -  Interface for PASCAL programs using the                ;
  4. ;                Macintalk speech driver.                    ;
  5. ;                                            ;
  6. ;      Copyright 1984, Joseph Katz / Mark Barton.  Not to be copied or       ;
  7. ;      distributed without the express written permission of the authors.    ;
  8. ;                                            ;
  9. ;      Modification History:                                ;
  10. ;           06/02/85 - Modified only minutes before shipment of software     ;
  11. ;              supplement.  Modified to separate code and data       ;
  12. ;              segments.  This was done in a vast hurry.  There      ;
  13. ;              are no known bugs in it, but it was not done cleanly. ;
  14. ;                                            ;
  15. ;                                            ;
  16. ;-------------------------------------------------------------------------------;
  17.  
  18.           .NOLIST
  19.           .INCLUDE   TLASM/SYSEQU.TEXT
  20.           .INCLUDE   TLASM/SYSTRAPS.TEXT
  21.           .INCLUDE   TLASM/SYSERR.TEXT
  22.           .INCLUDE   TLASM/TOOLTRAPS.TEXT
  23.           .INCLUDE   TLASM/TOOLEQU.TEXT
  24.           .LIST
  25.  
  26.  
  27. RdrHandle    .EQU   52          ;PBLOCK OFFSET OF HANDLE TO READER CODE
  28. RulesFN         .EQU   60          ;OFFSET TO READER EXCEPTIONS FILENAME POINTER
  29.  
  30. IDPitchMode  .EQU   0
  31. IDRate         .EQU   2          ;ID=1 IS USED FOR KILLIO
  32. IDSex         .EQU   3          ;RESERVED FOR FUTURE IMPLEMENTATION
  33. IDBaseline   .EQU   4
  34.  
  35. fullUnitT    .EQU   -4000     ;ERROR CODE FOR DRIVER TABLE FULL
  36.  
  37. Pblock         .EQU   0          ;OFFSET TO IOPARMBLOCK
  38. ReaderHandle .EQU   66          ;OFFSET TO READER HANDLE
  39. SpeechRfNum  .EQU   70          ;OFFSET TO SPEECH DRIVER REFERENCE NUMBER
  40. TalkRefNum   .EQU   74          ;OFFSET TO TALK PACKAGE REFNUM
  41.  
  42.  
  43. ; FUNCTION SpeechOn(EXCPFile: Str255; VAR SpeechHandle: SpeechRecord): SpeechErr;
  44.  
  45. ; Open speech driver. This is complicated by the need to arbitrate the
  46. ; driver unit number, which must be done prior to the actual device open.
  47.  
  48.           .FUNC        SpeechOn,1
  49.  
  50.           MOVE.L    A2,-(SP)            ;SAVE A2 ON STACK
  51.  
  52. ; Try to allocate driver globals area
  53.           MOVE.L    #100,D0            ;GRAB 100 BYTES
  54.           _NewHandle
  55.           MOVE.L    8(SP),A1            ;GET SPEECH RECORD ADDR
  56.           MOVE.L    A0,(A1)            ;SAVE GLOBALS HANDLE
  57.           TST.W        D0
  58.           BNE.S        ONERROR            ;IF ERROR, JUST RETURN
  59.           _HLock                ;LOCK HANDLE
  60.           MOVE.L    (A0),A2            ;SAVE POINTER TO GLOBALS
  61.  
  62. ; Clear parm block
  63.           MOVEQ        #0,D0
  64.           MOVEQ        #24,D1
  65.           MOVE.L    A2,A0
  66. CLOOP      MOVE.L    D0,(A0)+
  67.           DBF        D1,CLOOP
  68.  
  69. ; Open MacinTalk resource file
  70.  
  71.           CLR.W        -(SP)            ;SPACE FOR RETURN CODE
  72.           PEA        DriverID            ;NAME OF RESOURCE FILE
  73.           _OpenResFile                ;OPEN IT
  74.           MOVE.W    (SP)+,D0            ;GET RESOURCE FILE ID
  75.           BPL.S        GOTRESFILE            ;GOOD RETURN, BRANCH
  76.           MOVE.W    ResErr,D0            ;SET RETURN CODE
  77.  
  78. ONERROR      MOVE.L    (SP)+,A2            ;RESTORE A2
  79.           MOVE.L    (SP),8(SP)            ;MOVE RETURN ADDR
  80.           ADDQ.L    #8,SP            ;FIX STACK
  81.           MOVE.W    D0,4(SP)            ;SET RETURN CODE
  82.           RTS                    ;AND GO AWAY
  83.  
  84. GOTRESFILE MOVE.W   D0,TalkRefNum(A2)   ;SAVE FILE REFNUM FOR LATER
  85.  
  86.  
  87. ; Set ResPreLoad to FALSE
  88.  
  89.           MOVE.B    #0,-(SP)
  90.           _SetResLoad
  91.  
  92.  
  93. ; Get handle to synthesizer resource; TYPE = DRVR, NAME=MacinTalk
  94.  
  95.           CLR.L        -(SP)            ;SPACE FOR RETURN CODE
  96.           MOVE.L    #'DRVR',-(SP)       ;RESOURCE TYPE
  97.           PEA        SpeechName            ;RESOURCE NAME
  98.           _GetNamedResource            ;GET DRIVER RESOURCE
  99.           MOVE.L    (SP)+,A1            ;GET HANDLE TO RESOURCE (*** WAS AFTER BNE)
  100.           MOVE.W    ResErr,D0            ;GOOD RETURN?
  101.           BNE.S        ONERROR            ;NO, BRANCH TO ERROR RETURN
  102.  
  103.  
  104. ; Restore ResPreLoad to TRUE
  105.  
  106.           MOVE.B    #1,-(SP)
  107.           _SetResLoad
  108.  
  109.  
  110. ; Find an empty slot in driver unit table (looking backwards from end)
  111.  
  112.           MOVE.L    uTableBase,A0       ;GET DRIVER UNIT TABLE BASE
  113.           ADDA.W    #128,A0            ;START AT END+4 OF UNIT TABLE
  114.           MOVE.W    #32,D0            ;LAST UNIT IN TABLE IS #31
  115.  
  116. @3      SUBQ.W    #1,D0            ;REDUCE SLOT NUMBER
  117.           CMP.W        #18,D0            ;NO FREE SLOTS BELOW UNIT 18
  118.           BGT.S        @4
  119.           MOVE.W    #fullUnitT,D0       ;SETUP ERROR CODE
  120.           BRA.S        ONERROR            ;AND GO AWAY
  121.  
  122. @4      CMPI.L    #0,-(A0)            ;IS SLOT EMPTY?
  123.           BNE.S        @3                ;NO, KEEP LOOPING
  124.  
  125.  
  126. ; Change resource ID to new driver number, and load in resource data
  127.  
  128.           MOVE.W    D0,D1            ;DRIVER NUMBER
  129.           ADDQ.W    #1,D1            ;
  130.           NEG.W        D1                ;REF NUMBER
  131.           MOVE.W    D1,SpeechRfNum(A2)  ;SAVE REFERENCE NUMBER
  132.  
  133.           MOVE.L    A1,-(SP)            ;RESOURCE HANDLE
  134.           MOVE.W    D0,-(SP)            ;NEW DRIVER NUMBER
  135.           MOVE.L    #0,-(SP)            ;DON'T CHANGE THE RESOURCE NAME
  136.           _SetResInfo
  137.  
  138.  
  139.           MOVE.L    A1,-(SP)
  140.           _LoadResource
  141.           MOVE.W    resErr,D0            ;FOR DEBUGGING
  142.  
  143.  
  144.           MOVE.L    A1,A0            ;TRANSFER HANDLE TO A0
  145.           _HLock                ;LOCK DRIVER CODE DOWN
  146.  
  147.  
  148. ; Get SpeechOn input parms from stack
  149.  
  150.           MOVE.L    (SP)+,A2            ;RESTORE A2
  151.           MOVE.L    (SP)+,A0            ;GET RETURN ADDRESS
  152.           MOVE.L    (SP)+,D0            ;GET ADDR OF SPEECHREC HANDLE
  153.           MOVE.L    (SP)+,A1            ;GET EXCPS FILENAME PTR
  154.           MOVE.L    A0,-(SP)            ;RESTORE RETURN ADDR
  155.  
  156.           MOVE.L    A2,-(SP)            ;SAVE A2
  157.           MOVE.L    D0,A2            ;ADDR OF DEV GLOBALS HANDLE
  158.           MOVE.L    (A2),A2            ;DEVICE GLOBALS HANDLE
  159.           MOVE.L    A2,-(SP)            ;SAVE DEVICE GLOBALS HANDLE
  160.           MOVE.L    (A2),A2            ;DEREF TO POINTER
  161.  
  162. ; Build parm block and open the driver
  163.  
  164.           LEA        Pblock(A2),A0       ;A0 --> PARM BLOCK
  165.           MOVE.L    A1,RulesFN(A0)      ;SAVE PTR TO EXCPS FILENAME IN PBLOCK
  166.           LEA        SpeechName,A1       ;A1 --> DRIVER NAME
  167.           MOVE.L    A1,IOFileName(A0)   ;STORE DRIVER NAME IN PARM BLOCK
  168.           CLR.W        IODrvNum(A0)        ;USE DEFAULT DRIVE
  169.           CLR.W        IOFileType(A0)      ;CLEAR TYPE/PERMISSIONS
  170.           CLR.L        IOOwnBuf(A0)        ;USE SYSTEM BUFFER
  171.  
  172.           _Open
  173.           MOVE.W    IOResult(A0),12(SP)            ;SAVE RETURN CODE FROM OPEN
  174.           MOVE.L    RdrHandle(A0),ReaderHandle(A2)  ;SAVE HANDLE TO READER CODE
  175.  
  176.           MOVE.L    (SP)+,A0            ;UNLOCK DEVICE GLOBALS
  177.           _HUnlock
  178.  
  179.           MOVE.L    (SP)+,A2            ;RESTORE A2
  180.           RTS
  181.  
  182.  
  183. SpeechName .BYTE    7
  184.            .ASCII   '.SPEECH'
  185. DriverID   .BYTE    9
  186.            .ASCII   'MacinTalk'
  187.  
  188.  
  189.  
  190.  
  191. ;  PROCEDURE SpeechOff(SpeechHandle: SpeechRecord);
  192.  
  193. ;      Closes speech driver.
  194.  
  195.           .PROC        SpeechOff
  196.  
  197.           MOVE.L    A2,-(SP)            ;SAVE A2
  198.           MOVE.L    8(SP),A0            ;GET DEVICE GLOBALS HANDLE
  199.           _HLock
  200.           MOVE.L    (A0),A2            ;DEREFERENCE TO POINTER
  201.  
  202.           LEA        Pblock(A2),A0       ;POINTER TO PARM BLOCK
  203.           _Close    ,IMMED
  204.  
  205.           MOVE.W    TalkRefNum(A2),D0   ;MacinTalk REFNUM
  206.           BEQ.S        @1                ;DONT CLOSE SYSTEM RES FILE
  207.           MOVE.W    D0,-(SP)
  208.           _CloseResFile                ;BYE-BYE
  209.  
  210. @1      MOVE.L    8(SP),A0            ;GET DEVICE GLOBALS HANDLE
  211.           _HUnlock                ;UNLOCK IT
  212.           _DisposHandle                ;TOSS IT
  213.           MOVE.L    (SP)+,A2            ;RESTORE A2
  214.           MOVE.L    (SP),4(SP)            ;FIXUP STACK AND RETURN
  215.           ADDQ.L    #4,SP
  216.           RTS
  217.  
  218.  
  219. ;  PROCEDURE SpeechRate(SpeechHandle: SpeechRecord; Rate: Integer);
  220.  
  221. ;      Set the speaking rate in words/minute.  Range and validity
  222. ;      checking is done in SpeechPrime.
  223.  
  224.           .PROC        SpeechRate
  225.  
  226.           MOVE.L    (SP)+,D1            ;GET RETURN ADDR
  227.           MOVE.W    (SP)+,D2            ;GET RATE PARM
  228.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS
  229.           MOVE.L    D1,-(SP)            ;RESTORE RETURN ADDR
  230.  
  231.           MOVE.L    A0,-(SP)            ;SAVE DEVICE GLOBALS HANDLE
  232.           _HLock                ;LOCK IT
  233.           MOVE.L    (A0),A1            ;DEREF GLOBALS HANDLE
  234.  
  235.           LINK        A6,#-32              ;CREATE PARM BLOCK ON STACK
  236.           LEA        -32(A6),A0              ;POINT A0 AT PARM BLOCK
  237.  
  238.           MOVE.W    SpeechRfNum(A1),IORefNum(A0)  ;SET SPEECH REFNUM
  239.           MOVE.W    #IDRate,CSCode(A0)          ;SET RATE PARM ID
  240.           MOVE.W    D2,CSParam(A0)          ;STORE RATE PARM
  241.  
  242.           _Control  ,IMMED
  243.  
  244.           UNLK        A6                    ;REMOVE DCE FROM STACK
  245.  
  246.           MOVE.L    (SP)+,A0            ;RESTORE DEVICE GLOBALS
  247.           _HUnlock                ;UNLOCK IT
  248.  
  249.           RTS
  250.  
  251.  
  252.  
  253. ;  PROCEDURE SpeechSex(SpeechHandle: SpeechRecord; SpeakerSex: Sex);
  254.  
  255. ;      Set the speaking sex as Male or Female.
  256.  
  257.           .PROC        SpeechSex
  258.  
  259.           MOVEQ        #0,D2            ;CLEAR
  260.           MOVE.L    (SP)+,D1            ;GET RETURN ADDR
  261.           MOVE.B    (SP)+,D2            ;GET SEX PARM (NOTE .B ON MOVE)
  262.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS
  263.           MOVE.L    D1,-(SP)            ;RESTORE RETURN ADDR
  264.  
  265.           MOVE.L    A0,-(SP)            ;SAVE GLOBALS ON STACK
  266.           _HLock                ;LOCK DEVICE GLOBALS
  267.           MOVE.L    (A0),A1            ;DEREFERENCE TO POINTER
  268.  
  269.           LINK        A6,#-32              ;CREATE PARM BLOCK ON STACK
  270.           LEA        -32(A6),A0              ;POINT A0 AT PARM BLOCK
  271.           MOVE.W    SpeechRfNum(A1),IORefNum(A0)  ;SET SPEECH REFNUM
  272.           MOVE.W    #IDSex,CSCode(A0)          ;SET SEX PARM ID
  273.           MOVE.W    D2,CSParam(A0)          ;STORE SEX PARM
  274.  
  275.           _Control  ,IMMED
  276.  
  277.           UNLK        A6                ;REMOVE PARM BLOCK FROM STACK
  278.  
  279.           MOVE.L    (SP)+,A0            ;RESTORE GLOBALS HANDLE
  280.           _HUnlock                ;UNLOCK HANDLE
  281.  
  282.           RTS
  283.  
  284.  
  285.  
  286. ;  PROCEDURE SpeechPitch(SpeechHandle: SpeechRecord; Pitch: Integer; Mode: F0Mode);
  287.  
  288. ;      Sets the baseline pitch and the F0 mode.  All parameter
  289. ;      validity and range checking is done in SpeechPrime routines.
  290.  
  291.           .PROC        SpeechPitch
  292.  
  293.           MOVEQ        #0,D2            ;CLEAR THE BUGGER
  294.           MOVE.L    (SP)+,A1            ;GET RETURN ADDR
  295.           MOVE.B    (SP)+,D2            ;GET PITCH MODE
  296.           MOVE.W    (SP)+,D1            ;GET BASELINE PITCH
  297.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS HANDLE
  298.           MOVE.L    A1,-(SP)            ;RESTORE RETURN ADDR
  299.  
  300.           MOVE.L    A0,-(SP)            ;SAVE GLOBALS ON STACK
  301.           _HLock                ;LOCK GLOBALS
  302.           MOVE.L    (A0),A1            ;DEREFERENCE
  303.  
  304.           LINK        A6,#-32            ;CREATE ROOM FOR PARM BLOCK
  305.           LEA        -32(A6),A0
  306.           MOVE.W    SpeechRfNum(A1),IORefNum(A0)
  307.  
  308.           MOVE.W    #IDPitchMode,CSCode(A0)      ;SET MODE ID
  309.           MOVE.W    D2,CSParam(A0)          ;SET PITCH MODE
  310.           _Control  ,IMMED
  311.  
  312.           MOVE.W    #IDBaseline,CSCode(A0)      ;SET BASELINE ID
  313.           MOVE.W    D1,CSPARAM(A0)          ;SET BASELINE PITCH
  314.           _Control  ,IMMED
  315.  
  316.           UNLK        A6
  317.  
  318.           MOVE.L    (SP)+,A0            ;RESTORE GLOBALS HANDLE
  319.           _HUnlock                ;UNLOCK HANDLE
  320.  
  321.           RTS
  322.  
  323.  
  324.  
  325. ;  FUNCTION MacinTalk(SpeechHandle: SpeechRecord; phonemes: Handle): SpeechErr;
  326.  
  327. ;      Macintalk glue passes phonemes handle to speech driver
  328. ;      write routine.
  329.  
  330.           .FUNC        MacinTalk
  331.  
  332.           MOVE.L    (SP)+,D0            ;GET RETURN ADDR
  333.           MOVE.L    (SP)+,A1            ;GET INPUT HANDLE
  334.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS HANDLE
  335.           MOVE.L    D0,-(SP)            ;RESTORE RETURN ADDR
  336.  
  337.           MOVE.L    A0,-(SP)            ;SAVE ON STACK
  338.           _HLock                ;LOCK GLOBALS HANDLE
  339.  
  340.           MOVE.L    A1,A0            ;COPY INPUT HANDLE TO A0
  341.           _GetHandleSize            ;GET INPUT HANDLE SIZE IN D0
  342.  
  343.           MOVE.L    A2,-(SP)
  344.           MOVE.L    4(SP),A2
  345.           MOVE.L    (A2),A2
  346.  
  347.           LEA        Pblock(A2),A0          ;POINT A0 TO PARM BLOCK
  348.           MOVE.W    SpeechRfNum(A2),IORefNum(A0)  ;STORE REF NUM
  349.           MOVE.L    A1,IOBuffer(A0)          ;STORE INPUT HANDLE
  350.           MOVE.L    D0,IOByteCount(A0)          ;STORE INPUT HANDLE LENGTH
  351.  
  352.           _Write    ,IMMED            ;GO TO IT
  353.  
  354.           MOVE.L    (SP)+,A2            ;RESTORE A2
  355.           MOVE.L    (SP)+,A0            ;RESTORE DEVICE GLOBALS HANDLE
  356.           MOVE.W    D0,-(SP)            ;SAVE WRITE RETURN CODE
  357.           _HUnlock                ;UNLOCK GLOBALS
  358.           MOVE.W    (SP)+,D0            ;RESTORE WRITE RETURN CODE
  359.  
  360.           MOVE.W    D0,4(SP)            ;PUT RETURN CODE ON STACK
  361.           RTS
  362.  
  363.  
  364.  
  365. ; FUNCTION Reader(theSpeech: SpeechHandle;
  366. ;          English: Pointer;
  367. ;          EnglishLen: LongInt;
  368. ;          Output: Handle): Integer;
  369.  
  370.  
  371.           .FUNC        Reader,2            ;READER GLUE
  372.  
  373.           MOVE.L    16(SP),A0            ;GET DEVICE GLOBALS HANDLE
  374.           MOVE.L    12(SP),16(SP)
  375.           MOVE.L    8(SP),12(SP)
  376.           MOVE.L    4(SP),8(SP)
  377.           MOVE.L    (SP),4(SP)
  378.           ADDQ.L    #4,SP
  379.  
  380.           _HLock
  381.           MOVE.L    (A0),A0              ;DEREFERENCE GH
  382.           MOVE.L    ReaderHandle(A0),A0          ;GET HANDLE TO READER CODE
  383.           _HLock                  ;LOCK CODE DOWN
  384.  
  385.           MOVE.L    (A0),A0            ;GET PTR TO CODE
  386.           JMP        (A0)            ;GO DO IT
  387.  
  388.           RTS
  389.  
  390.           .END
  391.  
  392.